package com.mapfinal.server.api;

import com.jfinal.kit.StrKit;
import com.mapfinal.server.MapfinalServerConsts;
import com.mapfinal.server.api.model.MfApp;
import com.mapfinal.server.cache.MapCache;

/**
 * 使用流程：同调用第三方平台接口 <br>
 * 1、api 开发平台申请appid ，app_secret ，或自行提供给消费方 <br>
 * 2、消费方通过 appid ，app_secret 获得 access_token ( 有效期2小时) <br>
 * 3、消费方调用接口携带 accessToken 参数，验证通过可以才访问接口，未提供返回错误信息 <br>
 * 参考： https://blog.csdn.net/qq_41463655/article/details/103376957 <br>
 * @author yangyong
 *
 */
public class ApiTokenManager {
	
	private static final ApiTokenManager manage = new ApiTokenManager(); 
	
	private MapCache cache = null;
	
	private ApiTokenManager() {
		
	}
	
	public static ApiTokenManager me() {
		return manage;
	}
	
	/**
	 * 获取token
	 * @param appId
	 * @param appSecret
	 * @return
	 */
	public String getAccessToken(MfApp appResult) {
		if(appResult==null) {
			return null;
		}
		//删除旧的token
		String oldToken = appResult.getAccessToken();
		getCache().del(MapfinalServerConsts.SERVER_TOKEN + "-" + oldToken);
		//生成新的token
		String accessToken = AppUtils.getAccessToken();
		appResult.setAccessToken(accessToken);
		boolean flag = appResult.update();
		if(flag) {
			//加入到缓存
			getCache().set(MapfinalServerConsts.SERVER_TOKEN + "-" + accessToken, appResult.getAppId(), MapfinalServerConsts.TOKEN_SECONDS);
			return accessToken;
		} else {
			return null;
		}
	}
	
	public String getToken(MfApp appResult) {
		if(appResult==null) {
			return null;
		}
		//删除旧的token
		String oldToken = appResult.getAccessToken();
		boolean tflag = validation(oldToken);
		if(tflag) {
			return oldToken;
		} else {
			getCache().del(MapfinalServerConsts.SERVER_TOKEN + "-" + oldToken);
			//生成新的token
			String accessToken = AppUtils.getAccessToken();
			appResult.setAccessToken(accessToken);
			boolean flag = appResult.update();
			if(flag) {
				//加入到缓存
				getCache().set(MapfinalServerConsts.SERVER_TOKEN + "-" + accessToken, appResult.getAppId(), MapfinalServerConsts.TOKEN_SECONDS);
				return accessToken;
			} else {
				return null;
			}
		}
	}

	/**
	 * 验证token
	 * @param accessToken
	 * @return
	 */
	public boolean validation(String accessToken) {
		String appId = getCache().get(MapfinalServerConsts.SERVER_TOKEN + "-" + accessToken);
		if(StrKit.notBlank(appId)) {
			//刷新时间
			getCache().expire(MapfinalServerConsts.SERVER_TOKEN + "-" + accessToken, MapfinalServerConsts.TOKEN_SECONDS);
			return true;
		} else {
			return false;
		}
	}
	
	public MapCache getCache() {
		if(cache==null) {
			cache = new MapCache();
		}
		return cache;
	}

	public void setCache(MapCache cache) {
		this.cache = cache;
	}
}
